package top.kaoshanji.p1ch11b;

import top.kaoshanji.p1ch11a.BMWModel;
import top.kaoshanji.p1ch11a.BenzModel;

import java.util.ArrayList;
import java.util.List;

/**
 * 代码清单-p1ch11b-107页a：导演类
 * 可以随意组合，预制多种创建顺序
 * @author kaoshanji
 * ^_^
 * create time 2025/3/22 15:30
 */
public class Director {

    private List<String> sequence = new ArrayList<>();
    private BenzBuilder benzBuilder = new BenzBuilder();
    private BMWBuilder bmwBuilder = new BMWBuilder();

    // A类型奔驰车模型：先 start ，然后 stop ，其他什么引擎、喇叭一概没有
    public BenzModel getABenzModel() {
        // 因为 sequence 是成员属性，可能在其他地方使用过，那么，容器就被污染了
        this.sequence.clear();

        // ABenzModel 的执行顺序
        this.sequence.add("start");
        this.sequence.add("stop");

        // 按照顺序返回一个奔驰车
        this.benzBuilder.setSequence(this.sequence);
        return this.benzBuilder.getCarModel();
    }

    // B型号奔驰车模型：先发动引擎，然后启动，然后停止，没有喇叭
    public BenzModel getBBenzModel() {
        this.sequence.clear();

        this.sequence.add("engineBoom");
        this.sequence.add("start");
        this.sequence.add("stop");

        this.benzBuilder.setSequence(this.sequence);
        return this.benzBuilder.getCarModel();
    }

    // C型号宝马车：先按下喇叭（炫耀嘛），然后启动，然后停止
    public BMWModel getCBMWModel() {
        this.sequence.clear();

        this.sequence.add("alarm");
        this.sequence.add("start");
        this.sequence.add("stop");

        this.bmwBuilder.setSequence(this.sequence);
        return this.bmwBuilder.getCarModel();
    }

    // D类型宝马车：只有一个功能，就是跑，启动起来就跑，永不停止
    public BMWModel getDBMWModel() {
        this.sequence.clear();

        this.sequence.add("start");

        this.bmwBuilder.setSequence(this.sequence);
        return this.bmwBuilder.getCarModel();
    }

    /*
     * 这里还可以有很多方法，你可以先停止，然后再启动，或者一直停着不动，静态的嘛
     * 导演类嘛，按照什么顺序是导演说了算
     */

}
